www.gusucode.com > 基于matlab GUI界面的雷达仿真代码 具有丰富的参数选项 如目标个数,频率,脉冲宽度 > 基于matlab GUI界面的雷达仿真代码 具有丰富的参数选项 如目标个数,频率,脉冲宽度/RADAR simulation code/runRadarSim.m
function runRadarSim(handles,analyzeBufferMode); warning off all handleRadarControlls(handles,'off'); handles.antenaGain = buildAntenaGain(handles); figure(handles.figure1); curentTime = handles.curentTime; pulseNum = handles.pulseNum; PRI = str2num( get(handles.PRI,'string') )/1e3; w = str2num( get(handles.ZSA,'string') ); updateRate = str2num( get(handles.updateRate,'string') ); lastUpdate = cputime; Fs = str2num( get(handles.samplingRate,'string') ) * 1e3; %Fs was entered in Khz PRISize = PRI*Fs; nPRI = str2num( get(handles.bufferSize,'string') ) ; bufferSize = PRISize*nPRI; returnPulses = zeros( bufferSize,1); DigiNoise = zeros( size(returnPulses) ); antenaGain = handles.antenaGain; targetsManuv = str2num(get(handles.targetsManuver,'string')); % Digitizer Noise n = get(handles.digitizerNoiseLevel,'value'); temp = get(handles.digitizerNoiseLevel,'string'); if ~strcmp(temp{n},'-100') n=str2num(temp{n}); digitizerNoiseLevel = 10^n; else digitizerNoiseLevel = 0; end % RF noise n = get(handles.RFnoise,'value'); temp = get(handles.RFnoise,'string'); if ~strcmp(temp{n},'-100') n=str2num(temp{n}); RFnoiseLevel = 10^n; else RFnoiseLevel = 0; end hold on; PW = get(handles.PW,'value') * PRI; PWn = round( PW*Fs ); PRIn = PRI*Fs; transmisionIn = zeros(PWn*nPRI,1); for n =1:nPRI transmisionIn( (n-1)*PWn+1:n*PWn ) = (1:PWn) + (n-1)*PRIn; end handles.foundTargets = []; targetsTime = 0; dilateKer = ones(PWn,1); lastUpdate = 0; lastUpdateCPUTime = cputime; [M n] = max(antenaGain); f = find(abs( antenaGain/M < 0.01 )); m = min( abs(f-n) ); angleRes = 2*m/length(antenaGain)*2*pi; targetsDistTol =PW*3e8/2; radarSector = w*updateRate; % Start the RADAR !!!!!!!!!!!!!!!! while get(handles.run,'value') | analyzeBufferMode Th = 10^get(handles.Th,'value'); Amp = 10^ get(handles.Amp,'value') ; MTIminV = get(handles.MTIsens,'value'); curentTime = curentTime+PRI; radarAngle = mod(w*curentTime,2*pi); if radarAngle < radarSector handles.foundTargets = []; end % -------------------------------- Finding the return pulses -------------------------------------------- targets = [handles.Targets ; handles.mountains]; curentReturnPulses = zeros( size(returnPulses) ); if ~isempty(targets) [t a phi] = targetsReturn(targets,antenaGain,Amp, curentTime,w, targetsTime,handles.IF_Freq); tIn = round( t*Fs ); tIn = max(tIn,1); tIn = min(tIn,bufferSize); for n=1:length(t) curentReturnPulses(tIn(n):tIn(n)+PWn-1) = curentReturnPulses(tIn(n):tIn(n)+PWn-1) + a(n)*exp(i*phi(n)); end end % -------------------------------- Adding new reception -------------------------------- index = 0:bufferSize-1; index = index + pulseNum*PRISize; index = (mod(index,bufferSize)+1)'; returnPulses(index) = returnPulses(index)+curentReturnPulses; % ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- if ~mod(pulseNum,nPRI) %Only processing every N number of pulses recievedSignal = returnPulses; % ---------------------------------------------------- Creating RF noise ---------------------------------------------------- if RFnoiseLevel RFnoise = randn( length(returnPulses),2 )* RFnoiseLevel *[1 ; i]; recievedSignal = recievedSignal+RFnoise; end % ---------------------------------------------------- Passing reception through the radars reciver BW---------------------------------------------- n = get(handles.RadarBW,'value'); temp = get(handles.RadarBW,'string'); radarBW=str2num(temp{n}) * 1e6; a = sqrt(2)/log(2); responseStart = 2/(radarBW/a); t = -responseStart : 1/Fs : responseStart; response = exp(-t'.^2*radarBW/a); response = response/sum(response); recievedSignal = conv2(recievedSignal,response,'same'); % Gausian sigma freq and time: Gf = 1/(2Gt) % Gf = BW/sqrt(2ln2) => Gt = ln2/(sqrt(2)BW) % ---------------------------------------------------- Creating Digitizer noise ---------------------------------------------------- if digitizerNoiseLevel DigiNoise = randn( bufferSize,2)* digitizerNoiseLevel * [1 ; i]; recievedSignal = recievedSignal+DigiNoise; end recievedSignal(transmisionIn) = 0; % Deleting the time which the radar transmited (couldn't recieve returnPulses = zeros( bufferSize,1); % Cleaning the pulses buffer %% Neads to filter the signal with a match filter (if activated) if get(handles.useMatchFilter,'value'); % cumultiveRecievedSignal = cumsum( recievedSignal ); % processedRecivedSignal = [ zeros(1,1) ; cumultiveRecievedSignal(PWn+1:end,1)-cumultiveRecievedSignal(1:end-PWn) ; zeros(PWn-1,1)]; processedRecivedSignal = conv2(recievedSignal,ones(PWn,1),'same'); else processedRecivedSignal = recievedSignal; end temp = reshape( abs(processedRecivedSignal),PRIn,[]); sumedCells = sum(temp,2); targetInBuffer = 0; % ---------------------------------------------- Was there a target ------------------------------------------------- if max(sumedCells) > Th %worth checking sumedCellsD = imdilate(sumedCells,dilateKer); f = find ( sumedCells == sumedCellsD & sumedCellsD > Th); if ~isempty(f) targetInBuffer = 1; R = (f(:) -PWn/2) / Fs / 2 * 3e8; RCS = sumedCells(f(:))/Th; targetV = ones(length(R),1)*12345; for Rind = 1:length(R) %Processing each Target pos = R(Rind)*[cos(radarAngle) sin(radarAngle)];; if get(handles.useMTI,'value') % Calculating the targets velocity acording to phase % shift rangeCells = f(Rind)+[0:PRIn:bufferSize-PRIn]; signal = abs( recievedSignal(rangeCells) ); phase = angle( recievedSignal(rangeCells) ); targetV(Rind) = MTIcalcTargetsV(handles,phase,PRI,MTIminV,signal); end if isempty(handles.foundTargets) handles.foundTargets(end+1).pos = pos; handles.foundTargets(end).RCS = sumedCells(f(Rind))/Th; handles.foundTargets(end).R = R(Rind); handles.foundTargets(end).plotted = 0; handles.foundTargets(end).v = targetV(Rind); else % checking if this target was already detected M = length(handles.foundTargets); angleToOldTargets = zeros(M,1); for m=1:M oldTargetAngle = mod( atan2(handles.foundTargets(m).pos(2), handles.foundTargets(m).pos(1)), 2*pi ); angleToOldTargets(m) = abs(oldTargetAngle - radarAngle); end [m(1) ind(1)] = min(angleToOldTargets); [m(2) ind(2)]= min(2*pi-angleToOldTargets); [ans mm] = min (m); m = m(mm); ind = ind(mm); distFromOldTarget = abs( handles.foundTargets(ind).R-R(Rind) ); if m < angleRes & distFromOldTarget < targetsDistTol % Was this target already detected % This target was already detected ! if handles.foundTargets(ind).RCS < RCS(Rind) % Keeping the parameters of the better target; handles.foundTargets(ind).pos = pos; handles.foundTargets(ind).RCS = RCS(Rind); handles.foundTargets(ind).R = R(Rind); handles.foundTargets(ind).v = targetV(Rind); end else handles.foundTargets(end+1).pos = pos; handles.foundTargets(end).RCS = RCS(Rind); handles.foundTargets(end).R = R(Rind); handles.foundTargets(end).plotted = 0; handles.foundTargets(end).v = targetV(Rind); end%if min( distFromOldTargets ) > PW*3e8/2 % Was this target already detected end %else if isempty(handles.foundTargets) end % for n = 1:length(R) end %if ~isempty(f) end %if max(sumedCells) > Th %worth checking %--------------------------------------------------------------------------------------------------------------------- if analyzeBufferMode analyzeBufferMode = 0; if get(handles.waitForTarget,'value') if ~targetInBuffer % if there was no target in this buffer keep scanning analyzeBufferMode = 1; end end if ~analyzeBufferMode analyzBuffer(handles,recievedSignal,processedRecivedSignal,sumedCells); end end %--------------------------------------------------------------------------------------------------------------------- if curentTime-lastUpdate > updateRate %Is it time to update the display lastUpdate = curentTime; currentCPUtime = cputime; delay = currentCPUtime - lastUpdateCPUTime; if delay < updateRate & delay > 0.01 pause(delay); end handles = plotFOV(handles,curentTime,w,handles.foundTargets,radarSector); lastUpdateCPUTime = cputime; % Updating targets accelaration dt = curentTime - targetsTime ; for n =1:length(handles.Targets) if dt > targetsManuv if rand(1) > 0.2 handles.Targets(n).XY = handles.Targets(n).XY + dt*handles.Targets(n).v+dt^2*handles.Targets(n).a; handles.Targets(n).v = handles.Targets(n).v+dt * handles.Targets(n).a; handles.Targets(n).a = randn(1,2)*5; end displayTargets(handles,'in radar display') targetsTime = curentTime; end end end % if mod(time,updateRate) < PRI %Is it time to update the display end %if ~mod(pulseNum,nPRI) %Only processing every N number of pulses pulseNum = pulseNum+1; end % while get(handles.run,'value') handles.pulseNum = pulseNum; handles.curentTime = curentTime; guidata(handles.run,handles); handleRadarControlls(handles,'on');